﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Transactions;
using System.Web;
using System.Web.Http;
using FimetContoDeposito.BLL;
using FimetContoDeposito.BLL.Facades;
using FimetContoDeposito.BLL.Metadata;
using FimetContoDeposito.BLL.Objects;
using FimetContoDeposito.BLL.ResultSets;
using FimetContoDeposito.DAL;
using GrayParrot.Core;
using GrayParrot.Core.Json;
using GrayParrot.Web.Controls;
using GrayParrot.Web.Formly;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace FimetContoDeposito.Controllers
{
    public class AnagraficaDTParameters : DTParameters
    {
        public string Customer { get; set; }

        public AnagraficaDTParameters()
        {

        }
    }

    public class AnagraficaArticoliController : GridCrudController<JObject, DTParameters>
    {
        #region Loading Fields...
        [HttpGet]
        public string LoadArticoloMoveFields(string idArticolo)
        {
            string retValue = null;

            var m_fields = new FormlyFactory()
                   .AddInput("Articolo", "Articolo", "", "", true, true, 0, 50, TextFieldBehaviors.Hidden)
                   .AddSelect("selMagazzini", "Magazzini", "", "seleziona il magazzino", false, true, null, "/api/Common/LoadCustomers", null, null, null, false)
                   .Create();

            m_fields.DefaultValue("Articolo", idArticolo);

            retValue = FormlyHelper.Serialize(m_fields);

            return retValue;
        }

        [HttpGet]
        public string LoadCustomersFields()
        {
            string retValue = null;

            var m_fields = new FormlyFactory()
                   .AddSelect("selMagazzini", "Magazzini", "", "seleziona il magazzino", false, true, null, "/api/Common/LoadCustomers", null, null, null, false)
                   .Create();

            retValue = FormlyHelper.Serialize(m_fields);

            return retValue;
        }

        [HttpGet]
        public string LoadFields()
        {
            string retValue = null;

            var m_fields = FormlyHelper.ToFormly<AnagraficaArticoliMetadata>(typeof(AnagraficaArticoliMetadata));

            #region DA CANCELLARE...
            //JsonSerializerSettings settings = new JsonSerializerSettings();
            //settings.ContractResolver = new NullToEmptyListResolver();
            //settings.Converters = new List<JsonConverter> { new Newtonsoft.Json.Converters.StringEnumConverter { CamelCaseText = false } };
            //settings.Formatting = Formatting.Indented;
            //settings.NullValueHandling = NullValueHandling.Ignore;
            //retValue = JsonConvert.SerializeObject(m_fields, settings);
            #endregion

            m_fields.DefaultValue<Guid>("UnitaDiMisura", Guid.Parse("F41FBBE0-4A5F-4720-BFFA-30055010548D"));

            retValue = FormlyHelper.Serialize(m_fields);

            return retValue;
        }

        [HttpGet]
        public string[] LoadFields(Guid id)
        {
            string[] retValue = new string[2] { string.Empty, string.Empty };

            ArticoloBag obj = null;
            using (AnagraficaArticoliFacade m_dc = AnagraficaArticoliFacade.Create())
            {
                ReturnValue<ArticoloBag> m_objs = m_dc.GetArticoloBag(id);
                if (m_objs.HasValue)
                {
                    obj = m_objs.Value;
                }
            }

            if (obj != null)
            {
                var m_fields = FormlyHelper.ToFormly<AnagraficaArticoliMetadata>(typeof(AnagraficaArticoliMetadata));

                JsonSerializerSettings settings = new JsonSerializerSettings();
                settings.ContractResolver = new NullToEmptyListResolver();
                settings.Converters = new List<JsonConverter> { 
                    new Newtonsoft.Json.Converters.StringEnumConverter { CamelCaseText = false }
                };

                settings.Formatting = Formatting.Indented;
                settings.NullValueHandling = NullValueHandling.Ignore;

                retValue[0] = JsonConvert.SerializeObject(m_fields, settings);

                retValue[1] = JsonConvert.SerializeObject(obj);

                m_fields.DefaultValue("Foto", obj.FotoArticolo);
            }
            else
            {
            }

            //
            return retValue;
        }

        [HttpGet]
        public string LoadFieldsCodXXXX(Guid idMagazzino, string codiceXXXX)
        {
            string retValue = null;

            var m_fields = FormlyHelper.ToFormly<AnagraficaArticoliMetadata>(typeof(AnagraficaArticoliMetadata));

            using (UNitaDiMisuraFacade m_udmf = UNitaDiMisuraFacade.Create())
            {
                ReturnValue<FCD_UnitaDiMisura> retV = m_udmf.GetDefault();

                if (retV.HasValue && retV.Value != null)
                {
                    m_fields.DefaultValue<Guid>("UnitaDiMisura", retV.Value.Id);
                }
            }

            m_fields.DefaultValue<Guid>("IdCliente", idMagazzino);
            m_fields.DefaultValue<string>("Codice", codiceXXXX);
            m_fields.DefaultValue<string>("Descrizione", codiceXXXX);
            m_fields.DefaultValue<bool>("IsXxxx", true);
            m_fields.Hide("IsXxxx");

            retValue = FormlyHelper.Serialize(m_fields);

            return retValue;
        }

        [HttpGet]
        public string LoadFieldsEx(Guid idMagazzino)
        {
            string retValue = null;

            var m_fields = FormlyHelper.ToFormly<AnagraficaArticoliMetadata>(typeof(AnagraficaArticoliMetadata));

            using (UNitaDiMisuraFacade m_udmf = UNitaDiMisuraFacade.Create())
            {
                ReturnValue<FCD_UnitaDiMisura> retV = m_udmf.GetDefault();

                if (retV.HasValue && retV.Value != null)
                {
                    m_fields.DefaultValue<Guid>("UnitaDiMisura", retV.Value.Id);
                }
            }

            m_fields.DefaultValue<Guid>("IdCliente", idMagazzino);
            m_fields.Hide("IsXxxx");

            retValue = FormlyHelper.Serialize(m_fields);

            return retValue;
        }

        [HttpGet]
        public string[] LoadFieldsEx(Guid id, Guid idMagazzino)
        {
            string[] retValue = new string[2] { string.Empty, string.Empty };

            ArticoloBag obj = null;
            using (AnagraficaArticoliFacade m_dc = AnagraficaArticoliFacade.Create())
            {
                ReturnValue<ArticoloBag> m_objs = m_dc.GetArticoloBag(id);
                if (m_objs.HasValue)
                {
                    obj = m_objs.Value;
                }
            }

            FCD_CodiciFornitori m_codiceFornitore = null;
            if (obj.CodiceFornitore.HasValue)
            {
                using (CodiciFornitoriFacade m_cff = CodiciFornitoriFacade.Create())
                {
                    ReturnValue<FCD_CodiciFornitori> m_objCF = m_cff.Get(obj.CodiceFornitore.Value);
                    if (m_objCF.HasValue)
                    {
                        m_codiceFornitore = m_objCF.Value;
                    }
                }
            }

            if (obj != null)
            {
                var m_fields = FormlyHelper.ToFormly<AnagraficaArticoliMetadataEdit>(typeof(AnagraficaArticoliMetadataEdit));

                m_fields.DefaultValue<Guid>("IdCliente", idMagazzino);
                m_fields.DefaultValue<string>("Foto", obj.FotoArticolo);
                m_fields.Hide("IsXxxx");

                if (m_codiceFornitore != null)
                {
                    m_fields.DefaultValue<Guid>("Fornitore", m_codiceFornitore.IdFornitore);
                }

                retValue[0] = FormlyHelper.Serialize(m_fields);

                retValue[1] = JsonConvert.SerializeObject(obj);
            }
            else
            {
            }

            //
            return retValue;
        }

        [HttpGet]
        public string LoadNewFornitoreFields()
        {
            string retValue = null;

            var m_fields = new FormlyFactory()
                   .AddSelect("selArticoli", "Articolo", "", "seleziona l'articolo", false, true, null, "/api/AnagraficaArticoli/LoadArticoli",null, null, null, false)
                   .AddEvent(EventTypes.OnChange, "CambiaFoto")
                   .Create();

            JsonSerializerSettings settings = new JsonSerializerSettings();
            settings.ContractResolver = new NullToEmptyListResolver();
            settings.Converters = new List<JsonConverter> { new Newtonsoft.Json.Converters.StringEnumConverter { CamelCaseText = false } };
            settings.Formatting = Formatting.Indented;
            settings.NullValueHandling = NullValueHandling.Ignore;

            retValue = JsonConvert.SerializeObject(m_fields, settings);

            return retValue;
        }
        
        #endregion

        [HttpPost]
        public async Task<HttpResponseMessage> Upload()
        {
            HttpResponseMessage retValue = null;

            try
            {
                JObject obj = null;
                FileUploaded m_file = null;
                dynamic json = null;
                List<MultipartFileData> m_fileData = null;

                if (Request.Content.IsMimeMultipartContent())
                {
                    //var root = HttpContext.Current.Server.MapPath("~/AppData/Temp/FileUploads");
                    var root = HttpContext.Current.Server.MapPath("~/Temp");
                    Directory.CreateDirectory(root);
                    var provider = new MultipartFormDataStreamProvider(root);

                    var result = await Request.Content.ReadAsMultipartAsync(provider);
                    if (result.FormData["model"] == null)
                    {
                        throw new HttpResponseException(HttpStatusCode.InternalServerError);
                    }

                    var model = result.FormData["model"];
                    //TODO: Do something with the json model which is currently a string
                    obj = JObject.Parse(model.ToString());

                    json = obj;

                    m_file = JsonConvert.DeserializeObject<FileUploaded>(json.Foto.ToString());

                    //get the files
                    m_fileData = new List<MultipartFileData>();
                    foreach (var file in result.FileData)
                    {
                        //TODO: Do something with each uploaded file
                        if (string.IsNullOrEmpty(file.Headers.ContentDisposition.FileName))
                        {
                            return Request.CreateResponse(HttpStatusCode.NotAcceptable, "This request is not properly formatted");
                        }
                        string fileName = file.Headers.ContentDisposition.FileName;
                        if (fileName.StartsWith("\"") && fileName.EndsWith("\""))
                        {
                            fileName = fileName.Trim('"');
                        }
                        if (fileName.Contains(@"/") || fileName.Contains(@"\"))
                        {
                            fileName = Path.GetFileName(fileName);
                        }

                        m_fileData.Add(file);

                        //string m_fileName = string.Format(@"{0}\{1}", m_file.Folder, fileName);
                        //byte[] documentData;
                        //documentData = File.ReadAllBytes(file.LocalFileName);
                        //File.WriteAllBytes(m_fileName, documentData);
                    }
                }
                else
                {
                    var sr = new StreamReader(HttpContext.Current.Request.InputStream);
                    string content = sr.ReadToEnd();

                    obj = JObject.Parse(content);

                    json = obj;
                }

                bool m_isXXXX = Boolean.Parse(json.IsXxxx.ToString());
                string m_tipologiaJ = json.Tipologia.ToString();
                Guid m_tipologia = (!string.IsNullOrWhiteSpace(m_tipologiaJ) ? Guid.Parse(m_tipologiaJ) : Guid.Empty);

                string m_codice = json.Codice;
                string m_descrizione = json.Descrizione;
                Guid m_idCliente = Guid.Parse(json.IdCliente.ToString());
                Guid m_unitaDiMisura = Guid.Parse(json.UnitaDiMisura.ToString());
                bool m_isAbilitato = Boolean.Parse(json.IsAbilitato.ToString());
                decimal m_pesoTeorico = decimal.Parse(json.PesoTeorico.ToString());
                decimal m_scortaMinima = decimal.Parse(json.ScortaMinima.ToString());
                decimal m_prezzoUnitario = decimal.Parse(json.PrezzoUnitario.ToString());
                decimal m_scontoFornitore = decimal.Parse(json.ScontoFornitore.ToString());
                string m_dimensioni = json.Dimensioni;
                string m_serieFamiglia = json.SerieFamiglia;
                decimal m_qtaPacco = decimal.Parse(json.QtaPacco.ToString());
                string m_note = json.Note;
                Guid m_idFornitore = (string.IsNullOrWhiteSpace(json.Fornitore.ToString()) ? Guid.Empty : Guid.Parse(json.Fornitore.ToString()));

                string m_umFattS = json.UMFatt.ToString();
                Guid m_umFatt = Guid.Empty;
                if (!string.IsNullOrWhiteSpace(m_umFattS))
                {
                    m_umFatt = Guid.Parse(m_umFattS);
                }

                string m_codiceFornitoreS = json.CodiceFornitore.ToString();
                Guid m_idCodiceFornitore = Guid.Empty;
                if (!string.IsNullOrWhiteSpace(m_codiceFornitoreS))
                {
                    m_idCodiceFornitore = Guid.Parse(m_codiceFornitoreS);
                }
                
                // check associazione fornitore - magazzino e se non esiste creala...

                //
                FCD_AnagraficaArticoli p = new FCD_AnagraficaArticoli();
                p.Id = Guid.NewGuid();
                p.Codice = m_codice;
                p.Descrizione = m_descrizione;
                p.Abilitato = m_isAbilitato;
                p.IdCliente = m_idCliente;
                p.PesoTeorico = m_pesoTeorico;
                p.PrezzoUnitario = m_prezzoUnitario;
                p.ScontoFornitore = m_scontoFornitore;
                p.ScortaMinima = m_scortaMinima;
                p.Dimensioni = m_dimensioni;
                p.QtaPacco = m_qtaPacco;
                p.SerieFamiglia = m_serieFamiglia;
                p.Note = m_note;
                p.IsXxxx = m_isXXXX;

                if (m_idFornitore != Guid.Empty)
                {
                    p.IdFornitore = m_idFornitore;
                }

                if (m_umFatt != Guid.Empty)
                {
                    p.UmFatt = m_umFatt;
                }

                if (m_tipologia != Guid.Empty)
                {
                    p.TipologiaArticolo = m_tipologia;
                }
                p.UnitaDiMisura = m_unitaDiMisura;

                if (m_file != null)
                {
                    p.Foto = string.Format(@"{0}\{1}", m_file.Folder, m_file.Name);
                }

                using (TransactionScope scope = new TransactionScope())
                {
                    using (AnagraficaArticoliFacade m_aaf = AnagraficaArticoliFacade.Create())
                    {
                        ReturnValue<bool> m_res = m_aaf.Add(p);

                        string m_message = string.Empty;

                        if (m_res.HasValue)
                        {
                            if (m_res.Value)
                            {
                                if (m_idCodiceFornitore != Guid.Empty)
                                {
                                    using (CodiciFornitoriFacade m_cff = CodiciFornitoriFacade.Create())
                                    {
                                        ReturnValue<bool> m_resACF = m_cff.SaveAssociazioneArticoli(p.Id, m_idCodiceFornitore, TipoAssociazioneCodiceFornitore.New);
                                        //Result<bool> m_value = ReturnValueHelper<bool>.Check(m_resACF);
                                        //m_message = m_value.Message;
                                    }
                                }

                                // sono riuscito a salvare l'articolo, posso salvare anche la foto...
                                if (m_file != null)
                                {
                                    var m_Folder = HttpContext.Current.Server.MapPath(string.Format("~/{0}", m_file.Folder));
                                    foreach (MultipartFileData f in m_fileData)
                                    {
                                        string m_fileName = string.Format(@"{0}\{1}", m_Folder, m_file.Name);
                                        byte[] documentData;
                                        documentData = File.ReadAllBytes(f.LocalFileName);
                                        File.WriteAllBytes(m_fileName, documentData);
                                    }
                                }

                                retValue = Request.CreateResponse(HttpStatusCode.OK, "Inserimento Anagrafica Articolo eseguito !");
                            }
                            else
                            {
                                retValue = Request.CreateResponse(HttpStatusCode.OK, "Inserimento Anagrafica Articolo fallito !");
                            }
                        }
                        else
                        {
                            if (m_res.HasError)
                            {
                                retValue = Request.CreateResponse(HttpStatusCode.OK, "Errore nella creazione dell'articolo. Possibile Codice Articolo già presente");
                            }
                        }
                    }

                    scope.Complete();
                }
            }
            catch (Exception ex)
            {
                retValue = Request.CreateResponse(HttpStatusCode.OK, ex.ToString());
                Console.WriteLine(ex.Message);
            }

            return retValue;
        }

        [HttpPost]
        public async Task<HttpResponseMessage> UploadEdit()
        {
            HttpResponseMessage retValue = null;

            try
            {
                JObject obj = null;
                FileUploaded m_file = null;
                dynamic json = null;
                List<MultipartFileData> m_fileData = null;

                if (Request.Content.IsMimeMultipartContent())
                {
                    //var root = HttpContext.Current.Server.MapPath("~/AppData/Temp/FileUploads");
                    var root = HttpContext.Current.Server.MapPath("~/Temp");
                    Directory.CreateDirectory(root);
                    var provider = new MultipartFormDataStreamProvider(root);

                    var result = await Request.Content.ReadAsMultipartAsync(provider);
                    if (result.FormData["model"] == null)
                    {
                        throw new HttpResponseException(HttpStatusCode.InternalServerError);
                    }

                    var model = result.FormData["model"];
                    //TODO: Do something with the json model which is currently a string
                    obj = JObject.Parse(model.ToString());

                    json = obj;

                    m_file = JsonConvert.DeserializeObject<FileUploaded>(json.Foto.ToString());

                    //get the files
                    m_fileData = new List<MultipartFileData>();
                    foreach (var file in result.FileData)
                    {
                        //TODO: Do something with each uploaded file
                        if (string.IsNullOrEmpty(file.Headers.ContentDisposition.FileName))
                        {
                            return Request.CreateResponse(HttpStatusCode.NotAcceptable, "This request is not properly formatted");
                        }
                        string fileName = file.Headers.ContentDisposition.FileName;
                        if (fileName.StartsWith("\"") && fileName.EndsWith("\""))
                        {
                            fileName = fileName.Trim('"');
                        }
                        if (fileName.Contains(@"/") || fileName.Contains(@"\"))
                        {
                            fileName = Path.GetFileName(fileName);
                        }

                        m_fileData.Add(file);

                        //string m_fileName = string.Format(@"{0}\{1}", m_file.Folder, fileName);
                        //byte[] documentData;
                        //documentData = File.ReadAllBytes(file.LocalFileName);
                        //File.WriteAllBytes(m_fileName, documentData);
                    }
                }
                else
                {
                    var sr = new StreamReader(HttpContext.Current.Request.InputStream);
                    string content = sr.ReadToEnd();

                    obj = JObject.Parse(content);

                    json = obj;
                }

                string m_tipologiaJ = json.Tipologia.ToString();
                Guid m_tipologia = (!string.IsNullOrWhiteSpace(m_tipologiaJ) ? Guid.Parse(m_tipologiaJ) : Guid.Empty);

                Guid m_id = Guid.Parse(json.Id.ToString());
                string m_codice = json.Codice;
                string m_descrizione = json.Descrizione;
                Guid m_idCliente = Guid.Parse(json.IdCliente.ToString());
                Guid m_unitaDiMisura = Guid.Parse(json.UnitaDiMisura.ToString());
                bool m_isAbilitato = Boolean.Parse(json.IsAbilitato.ToString());
                decimal m_pesoTeorico = decimal.Parse(json.PesoTeorico.ToString());
                decimal m_scortaMinima = decimal.Parse(json.ScortaMinima.ToString());
                decimal m_prezzoUnitario = decimal.Parse(json.PrezzoUnitario.ToString());
                decimal m_scontoFornitore = decimal.Parse(json.ScontoFornitore.ToString());
                string m_dimensioni = json.Dimensioni;
                string m_serieFamiglia = json.SerieFamiglia;
                decimal m_qtaPacco = decimal.Parse(json.QtaPacco.ToString());
                string m_note = json.Note;
                Guid m_idFornitore = (string.IsNullOrWhiteSpace(json.Fornitore.ToString()) ? Guid.Empty : Guid.Parse(json.Fornitore.ToString()));

                string m_umFattS = json.UMFatt.ToString();
                Guid m_umFatt = Guid.Empty;
                if (!string.IsNullOrWhiteSpace(m_umFattS))
                {
                    m_umFatt = Guid.Parse(m_umFattS);
                }

                string m_codiceFornitoreS = json.CodiceFornitore.ToString();
                Guid m_idCodiceFornitore = Guid.Empty;
                if (!string.IsNullOrWhiteSpace(m_codiceFornitoreS))
                {
                    m_idCodiceFornitore = Guid.Parse(m_codiceFornitoreS);
                }

                using (AnagraficaArticoliFacade m_dc = AnagraficaArticoliFacade.Create())
                {
                    ReturnValue<FCD_AnagraficaArticoli> m_ab = m_dc.Get(m_id);

                    if (m_ab.HasValue)
                    {
                        string m_fotoName = m_ab.Value.Foto;

                        FCD_AnagraficaArticoli objAA = m_ab.Value;
                        objAA.Codice = json.Codice;
                        objAA.Descrizione = json.Descrizione;
                        objAA.Abilitato = GrayParrot.Extensions.Types.TypeExtensions.GetValueOrDefault<bool>(json.IsAbilitato.ToString());
                        objAA.Note = m_note;
                        objAA.ScontoFornitore = m_scontoFornitore;
                        objAA.ScortaMinima = m_scortaMinima;
                        objAA.PrezzoUnitario = m_prezzoUnitario;
                        objAA.Dimensioni = m_dimensioni;
                        objAA.QtaPacco = m_qtaPacco;
                        objAA.SerieFamiglia = m_serieFamiglia;

                        if (m_idFornitore != Guid.Empty)
                        {
                            objAA.IdFornitore = m_idFornitore;
                        }

                        if (m_umFatt != Guid.Empty)
                        {
                            objAA.UmFatt = m_umFatt;
                        }

                        if (!string.IsNullOrWhiteSpace(m_tipologiaJ))
                        {
                            objAA.TipologiaArticolo = m_tipologia;
                        }

                        objAA.UnitaDiMisura = Guid.Parse(json.UnitaDiMisura.ToString());
                        //objAA.Foto = string.Format("{0}/{1}", m_image.FolderName, m_image.Filename);

                        if (objAA.PesoTeorico != null)
                        {
                            objAA.PesoTeorico = GrayParrot.Extensions.Types.TypeExtensions.GetValueOrDefault<decimal>(json.PesoTeorico.ToString());
                        }

                        ReturnValue<bool> result = m_dc.Edit(objAA);

                        string msg = "Modifica Anagrafica Articolo eseguita !";
                        if (result.HasValue && result.Value)
                        {
                            if (m_idCodiceFornitore != Guid.Empty)
                            {
                                using (CodiciFornitoriFacade m_cff = CodiciFornitoriFacade.Create())
                                {
                                    ReturnValue<bool> m_resRem = m_cff.RemoveAssociazioneArticoli(objAA.Id);
                                    if (m_resRem.HasValue && m_resRem.Value)
                                    {
                                        ReturnValue<bool> m_resACF = m_cff.SaveAssociazioneArticoli(objAA.Id, m_idCodiceFornitore, TipoAssociazioneCodiceFornitore.New);
                                        //Result<bool> m_value = ReturnValueHelper<bool>.Check(m_resACF);
                                        //m_message = m_value.Message;
                                    }
                                }
                            }
                            else
                            {
                                using (CodiciFornitoriFacade m_cff = CodiciFornitoriFacade.Create())
                                {
                                    ReturnValue<bool> m_resACF = m_cff.RemoveAssociazioneArticoli(objAA.Id);
                                }
                            }

                            if (m_fileData == null)
                            {
                                objAA.Foto = "";
                            }
                            else
                            {
                                if (m_fileData.Count() == 1)
                                {
                                    string m_fileName = m_fileData[0].Headers.ContentDisposition.FileName;
                                    if (!string.IsNullOrEmpty(m_fileName))
                                    {
                                        if (m_fileName.StartsWith("\"") && m_fileName.EndsWith("\""))
                                        {
                                            m_fileName = m_fileName.Trim('"');
                                        }
                                        if (m_fileName.Contains(@"/") || m_fileName.Contains(@"\"))
                                        {
                                            m_fileName = Path.GetFileName(m_fileName);
                                        }

                                        string m_fn = string.Format(@"{0}\{1}", m_file.Folder, m_fileName);

                                        if (m_fn != m_fotoName)
                                        {
                                            string m_Folder = HttpContext.Current.Server.MapPath(string.Format("~/{0}", m_file.Folder));
                                            string m_fnToSave = string.Format(@"{0}\{1}", m_Folder, m_fileName);

                                            byte[] documentData;
                                            documentData = File.ReadAllBytes(m_fileData[0].LocalFileName);
                                            File.WriteAllBytes(m_fnToSave, documentData);

                                            objAA.Foto = m_fn;
                                            
                                        }
                                    }
                                    else
                                    {
                                        msg += "\n.Immagine non salvata.";
                                    }
                                }
                            }

                            ReturnValue<bool> m_retEdit = m_dc.Edit(objAA);

                            if (m_retEdit.HasValue && m_retEdit.Value)
                            {
                                retValue = Request.CreateResponse(HttpStatusCode.OK, msg);
                            }
                            else
                            {
                                if (m_retEdit.HasError)
                                {
                                    retValue = Request.CreateResponse(HttpStatusCode.OK, m_retEdit.Error.Message);
                                }
                                else
                                {
                                    retValue = Request.CreateResponse(HttpStatusCode.OK, m_retEdit.Message);
                                }
                            }


                            
                        }
                    }
                    else
                    {
                        if (m_ab.HasError)
                        {
                            retValue = Request.CreateResponse(HttpStatusCode.OK, m_ab.Error.Message);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                retValue = Request.CreateResponse(HttpStatusCode.OK, ex.Message);
            }

            return retValue;
        }

        public override System.Net.Http.HttpResponseMessage Add(JObject data)
        {
            System.Net.Http.HttpResponseMessage retValue = new HttpResponseMessage(HttpStatusCode.InternalServerError);

            dynamic json = data;

            string m_messaggio = string.Empty;

            ImageField m_image = json.Foto.ToObject<ImageField>();


            HttpResponseMessage resultw = null;
            var httpRequest = HttpContext.Current.Request;

            if (httpRequest.Files.Count > 0)
            {
                var docfiles = new List<string>();
                foreach (string file in httpRequest.Files)
                {
                    var postedFile = httpRequest.Files[file];
                    var filePath = HttpContext.Current.Server.MapPath("~/" + postedFile.FileName);
                    postedFile.SaveAs(filePath);
                    docfiles.Add(filePath);
                }
                resultw = Request.CreateResponse(HttpStatusCode.Created, docfiles);
            }
            else
            {
                resultw = Request.CreateResponse(HttpStatusCode.InternalServerError);
            }

            try
            {
                string m_tipologia = (json.Tipologia != null ? json.Tipologia.ToString() : string.Empty);

                using (TransactionScope scope = new TransactionScope())
                {
                    FCD_AnagraficaArticoli obj = new FCD_AnagraficaArticoli();
                    obj.Id = Guid.NewGuid();
                    obj.Codice = json.Codice;
                    obj.Descrizione = json.Descrizione;
                    obj.Abilitato = GrayParrot.Extensions.Types.TypeExtensions.GetValueOrDefault<bool>(json.IsAbilitato.ToString());

                    if (!string.IsNullOrWhiteSpace(m_tipologia))
                    {
                        obj.TipologiaArticolo = Guid.Parse(m_tipologia);
                    }

                    obj.UnitaDiMisura = Guid.Parse(json.UnitaDiMisura.ToString());
                    obj.Foto = string.Format("{0}/{1}", m_image.FolderName, m_image.Filename);
                    obj.PesoTeorico = GrayParrot.Extensions.Types.TypeExtensions.GetValueOrDefault<decimal>(json.PesoTeorico.ToString());

                    obj.ScortaMinima = GrayParrot.Extensions.Types.TypeExtensions.GetValueOrDefault<decimal>(json.ScortaMinima.ToString());
                    obj.ScontoFornitore = GrayParrot.Extensions.Types.TypeExtensions.GetValueOrDefault<decimal>(json.ScontoFornitore.ToString());
                    obj.PrezzoUnitario = GrayParrot.Extensions.Types.TypeExtensions.GetValueOrDefault<decimal>(json.PrezzoUnitario.ToString());
                    obj.Note = "";

                    using (AnagraficaArticoliFacade m_dc = AnagraficaArticoliFacade.Create())
                    {
                        ReturnValue<bool> result = m_dc.Add(obj);

                        if (result.HasValue)
                        {
                            m_image.Save();

                            retValue = Request.CreateResponse(HttpStatusCode.OK, "Inserimento Anagrafica Articolo eseguito !");
                        }
                        else
                        {
                            retValue = Request.CreateResponse(HttpStatusCode.OK, "Errore nell'inserimento Anagrafica Articolo");
                        }
                    }

                    scope.Complete();
                }
            }
            catch (Exception ex)
            {
                string msg = string.Format("Errore nell'inserimento Anagrafica Articolo: {0}", ex.Message);
                retValue = Request.CreateResponse(HttpStatusCode.OK, msg);
            }

            return retValue;
        }

        /// <summary>
        /// Add anagrafica articoli considerando la relazione anagrafica - articoli per fornitore.
        /// </summary>
        /// <param name="data">The data.</param>
        /// <returns></returns>
        public System.Net.Http.HttpResponseMessage Add_oldarticoli(JObject data)
        {
            System.Net.Http.HttpResponseMessage retValue = new HttpResponseMessage(HttpStatusCode.InternalServerError);

            dynamic json = data;

            string m_messaggio = string.Empty;

            ImageField m_image = json.Foto.ToObject<ImageField>();


            HttpResponseMessage resultw = null;
            var httpRequest = HttpContext.Current.Request;

            if (httpRequest.Files.Count > 0)
            {
                var docfiles = new List<string>();
                foreach (string file in httpRequest.Files)
                {
                    var postedFile = httpRequest.Files[file];
                    var filePath = HttpContext.Current.Server.MapPath("~/" + postedFile.FileName);
                    postedFile.SaveAs(filePath);
                    docfiles.Add(filePath);
                }
                resultw = Request.CreateResponse(HttpStatusCode.Created, docfiles);
            }
            else
            {
                resultw = Request.CreateResponse(HttpStatusCode.InternalServerError);
            }

            try
            {
                string m_tipologia = (json.Tipologia != null ? json.Tipologia.ToString() : string.Empty);

                using (TransactionScope scope = new TransactionScope())
                {
                    FCD_AnagraficaArticoli obj = new FCD_AnagraficaArticoli();
                    obj.Id = Guid.NewGuid();
                    obj.Codice = json.Codice;
                    obj.Descrizione = json.Descrizione;
                    obj.Abilitato = GrayParrot.Extensions.Types.TypeExtensions.GetValueOrDefault<bool>(json.IsAbilitato.ToString());

                    if(!string.IsNullOrWhiteSpace(m_tipologia))
                    {
                        obj.TipologiaArticolo = Guid.Parse(m_tipologia);
                    }
                    
                    obj.UnitaDiMisura = Guid.Parse(json.UnitaDiMisura.ToString());
                    obj.Foto = string.Format("{0}/{1}", m_image.FolderName, m_image.Filename);
                    obj.PesoTeorico = GrayParrot.Extensions.Types.TypeExtensions.GetValueOrDefault<decimal>(json.PesoTeorico.ToString());

                    using (AnagraficaArticoliFacade m_dc = AnagraficaArticoliFacade.Create())
                    {
                        ReturnValue<bool> result = m_dc.Add(obj);

                        if (result.HasValue)
                        {
                            m_image.Save();

                            Guid m_idFornitore = Guid.Parse(json.Fornitore.ToString());
                            if (m_idFornitore != Guid.Empty)
                            {
                                using (ArticoliPerFornitoreFacade m_apff = ArticoliPerFornitoreFacade.Create())
                                {
                                    FCD_ArticoliPerFornitori m_apf = new FCD_ArticoliPerFornitori();
                                    m_apf.IdArticolo = obj.Id;
                                    m_apf.IdFornitore = Guid.Parse(json.Fornitore.ToString());
                                    m_apf.ScortaMinima = GrayParrot.Extensions.Types.TypeExtensions.GetValueOrDefault<decimal>(json.ScortaMinima.ToString());
                                    m_apf.ScontoFornitore = GrayParrot.Extensions.Types.TypeExtensions.GetValueOrDefault<decimal>(json.ScontoFornitore.ToString());
                                    m_apf.PrezzoUnitario = GrayParrot.Extensions.Types.TypeExtensions.GetValueOrDefault<decimal>(json.PrezzoUnitario.ToString());
                                    m_apf.Note = "";

                                    ReturnValue<bool> result1 = m_apff.Add(m_apf);

                                    if (result1.HasValue)
                                    {
                                        retValue = Request.CreateResponse(HttpStatusCode.OK, "Inserimento articolo eseguito !");
                                    }
                                    else
                                    {
                                        if (result1.HasError)
                                        {
                                            string m_msg = string.Format("Errore nell'inserimento articolo: {0}", result1.Error.Message);
                                            retValue = Request.CreateResponse(HttpStatusCode.OK, m_msg);
                                        }
                                    }
                                }
                            }
                            //retValue = Request.CreateResponse(HttpStatusCode.OK, "Inserimento Anagrafica Famiglia eseguito !");
                        }
                        else
                        {
                            retValue = Request.CreateResponse(HttpStatusCode.OK, "Errore nell'inserimento articolo");
                        }
                    }

                    scope.Complete();
                }
            }
            catch (Exception ex)
            {
                string msg = string.Format("Errore nell'inserimento articolo: {0}", ex.Message);
                retValue = Request.CreateResponse(HttpStatusCode.OK, msg);
            }

            return retValue;
        }

        public override System.Net.Http.HttpResponseMessage Edit(JObject data)
        {
            System.Net.Http.HttpResponseMessage retValue = new HttpResponseMessage(HttpStatusCode.InternalServerError);

            dynamic json = data;
            Guid m_id = Guid.Parse(json.Id.ToString());

            ImageField m_image = json.Foto.ToObject<ImageField>();

            string m_tipologia = (json.Tipologia != null ? json.Tipologia.ToString() : string.Empty);

            using (AnagraficaArticoliFacade m_dc = AnagraficaArticoliFacade.Create())
            {
                ReturnValue<FCD_AnagraficaArticoli> m_ab = m_dc.Get(m_id);

                if (m_ab.HasValue)
                {
                    FCD_AnagraficaArticoli obj = m_ab.Value;
                    obj.Codice = json.Codice;
                    obj.Descrizione = json.Descrizione;
                    obj.Abilitato = GrayParrot.Extensions.Types.TypeExtensions.GetValueOrDefault<bool>(json.IsAbilitato.ToString());
                    
                    if (!string.IsNullOrWhiteSpace(m_tipologia))
                    {
                        obj.TipologiaArticolo = Guid.Parse(m_tipologia);
                    }

                    obj.UnitaDiMisura = Guid.Parse(json.UnitaDiMisura.ToString());
                    obj.Foto = string.Format("{0}/{1}", m_image.FolderName, m_image.Filename);

                    if (obj.PesoTeorico != null)
                    {
                        obj.PesoTeorico = GrayParrot.Extensions.Types.TypeExtensions.GetValueOrDefault<decimal>(json.PesoTeorico.ToString());
                    }

                    ReturnValue<bool> result = m_dc.Edit(obj);

                    if (result.HasValue && result.Value)
                    {
                        m_image.Save();

                        Guid m_idFornitore = Guid.Parse(json.IdCliente.ToString());

                        ReturnValue<FCD_AnagraficaArticoli> m_anagArt = m_dc.Get(m_id, "FCD_ArticoliPerFornitoris");
                        if (m_anagArt.HasValue)
                        {
                            FCD_ArticoliPerFornitori m_apf = m_anagArt.Value.FCD_ArticoliPerFornitoris.First(x => x.IdArticolo == m_id && x.IdFornitore == m_idFornitore);

                            if (m_apf != null)
                            {
                                using (ArticoliPerFornitoreFacade m_apff = ArticoliPerFornitoreFacade.Create())
                                {
                                    m_apf.IdArticolo = obj.Id;
                                    m_apf.IdFornitore = Guid.Parse(json.Fornitore.ToString());
                                    m_apf.ScortaMinima = GrayParrot.Extensions.Types.TypeExtensions.GetValueOrDefault<decimal>(json.ScortaMinima.ToString());
                                    m_apf.ScontoFornitore = GrayParrot.Extensions.Types.TypeExtensions.GetValueOrDefault<decimal>(json.ScontoFornitore.ToString());
                                    m_apf.PrezzoUnitario = GrayParrot.Extensions.Types.TypeExtensions.GetValueOrDefault<decimal>(json.PrezzoUnitario.ToString());
                                    m_apf.Note = "";

                                    ReturnValue<bool> result1 = m_apff.Edit(m_apf);

                                    if (result1.HasValue)
                                    {
                                        retValue = Request.CreateResponse(HttpStatusCode.OK, "Inserimento articolo eseguito !");
                                    }
                                    else
                                    {
                                        if (result1.HasError)
                                        {
                                            string m_msg = string.Format("Errore nell'inserimento articolo: {0}", result1.Error.Message);
                                            retValue = Request.CreateResponse(HttpStatusCode.OK, m_msg);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                else
                {
                    retValue = Request.CreateResponse(HttpStatusCode.OK, "Articolo non trovato");
                }
            }

            return retValue;
        }

        public override System.Net.Http.HttpResponseMessage Delete(int id)
        {
            throw new NotImplementedException();
        }

        [HttpPost]
        public override System.Net.Http.HttpResponseMessage Delete(JObject data)
        {
            System.Net.Http.HttpResponseMessage retValue = new HttpResponseMessage(HttpStatusCode.InternalServerError);

            dynamic json = data;
            Guid m_id = Guid.Parse(json.id.ToString());

            ReturnValue<bool> resultRes = null; 
            using (MovimentiFacade m_mf = MovimentiFacade.Create())
            {
                resultRes = m_mf.CheckArticoloInMovimento(m_id);
            }

            if (resultRes.HasValue && !resultRes.Value)
            {
                using (AnagraficaArticoliFacade m_dc = AnagraficaArticoliFacade.Create())
                {
                    ReturnValue<bool> result = m_dc.Delete(m_id);

                    if (result.HasValue)
                    {
                        if (result.HasValue)
                        {
                            retValue = Request.CreateResponse(HttpStatusCode.OK, "Cancellazione Anagrafica Articolo effettuata !");
                        }
                        else
                        {
                            retValue = Request.CreateResponse(HttpStatusCode.OK, "Errore nella cancellazione della Anagrafica Articolo");
                        }

                    }
                    else
                    {
                        retValue = Request.CreateResponse(HttpStatusCode.OK, "Errore nella cancellazione della Anagrafica Articolo");
                    }
                }
            }
            else
            {
                if (resultRes.HasError)
                {
                    retValue = Request.CreateResponse(HttpStatusCode.OK, resultRes.Error.Message);
                }
                else
                {
                    retValue = Request.CreateResponse(HttpStatusCode.OK, "Cancellazione della Anagrafica Articolo non effettuata. Articolo utilizzato in un movimento.");
                }
            }

            return retValue;
        }

        public override HttpResponseMessage Load(DTParameters data)
        {
            throw new NotImplementedException();
        }
        
        
        [HttpPost]
        public System.Net.Http.HttpResponseMessage CreaArticoloXXXX(JObject data)
        {
            System.Net.Http.HttpResponseMessage retValue = new HttpResponseMessage(HttpStatusCode.InternalServerError);

            dynamic json = data;

            string m_codice = json.codice.ToString();
            string m_cliente = json.cliente.ToString();

            bool m_goOn = false;
            FCD_UnitaDiMisura m_unitaDiMisura = null;
            using (UNitaDiMisuraFacade m_udmF = UNitaDiMisuraFacade.Create())
            {
                ReturnValue<FCD_UnitaDiMisura> m_resUDM = m_udmF.GetDefault();
                if (m_resUDM.HasValue)
                {
                    m_unitaDiMisura = m_resUDM.Value;
                    m_goOn = true;
                }
                else
                {
                    if (m_resUDM.HasError)
                    {
                        retValue = Request.CreateResponse(HttpStatusCode.OK, m_resUDM.Error.Message);
                    }
                    else
                    {
                        retValue = Request.CreateResponse(HttpStatusCode.OK, "Unita di Misura di default non trovata. Creazione Articolo annullata.");
                    }
                }
            }

            if (m_goOn)
            {
                Guid m_idCliente = Guid.Parse(m_cliente);

                FCD_AnagraficaArticoli m_obj = new FCD_AnagraficaArticoli();
                m_obj.Codice = m_codice;
                m_obj.Descrizione = string.Format("Articolo XXXX - {0}", m_codice);
                m_obj.Abilitato = true;
                m_obj.IdCliente = m_idCliente;
                m_obj.UnitaDiMisura = m_unitaDiMisura.Id;

                using (AnagraficaArticoliFacade m_aaf = AnagraficaArticoliFacade.Create())
                {
                    ReturnValue<bool> m_resAdd = m_aaf.Add(m_obj);
                    if (m_resAdd.HasValue && m_resAdd.Value)
                    {
                        NameValue<string, Guid> m_nv = new NameValue<string, Guid>();
                        m_nv.name = m_obj.Codice;
                        m_nv.value = m_obj.Id;

                        JArray array = new JArray();
                        array.Add("Articolo XXXX creato.");
                        array.Add(JsonConvert.SerializeObject(m_nv));
                        JObject obj = new JObject();
                        obj["Data"] = array;

                        retValue = Request.CreateResponse(HttpStatusCode.OK, obj);
                    }
                    else
                    {
                        if (m_resAdd.HasError)
                        {
                            retValue = Request.CreateResponse(HttpStatusCode.InternalServerError, m_resAdd.Error.Message);
                        }
                        else
                        {
                            retValue = Request.CreateResponse(HttpStatusCode.InternalServerError, "Errore nella creazione di un articolo XXXX.");
                        }
                    }
                }
            }

            return retValue;
        }

        [HttpPost]
        public System.Net.Http.HttpResponseMessage LoadArticolimagazzino(AnagraficaDTParameters data)
        {
            System.Net.Http.HttpResponseMessage retValue = new HttpResponseMessage(HttpStatusCode.InternalServerError);

            if (data.Customer != null)
            {
                string m_idC = data.Customer.SanitizeDropdownItem();
                Guid m_id = Guid.Parse(m_idC);

                using (AnagraficaArticoliFacade m_dc = AnagraficaArticoliFacade.Create())
                {
                    ReturnValue<IQueryable<ArticoloBag>> m_objs = m_dc.GetAllArticoliBag(m_id);

                    DTResult<ArticoloBag> result = DTResult<ArticoloBag>.Empty("Nessun elemento trovato");
                    if (m_objs.HasValue)
                    {
                        AnagraficaArticoliResultSet m_rs = new AnagraficaArticoliResultSet(data, m_objs.Value);
                        result = m_rs.GetResult();
                    }
                    else
                    {
                        if (m_objs.HasError)
                        {
                            result.Message.MessageType = MessageTypes.Error;
                            result.Message.Message = m_objs.Error.Message;
                        }
                    }

                    retValue = Request.CreateResponse(HttpStatusCode.OK, result);
                }
            }
            else
            {
                retValue = Request.CreateResponse(HttpStatusCode.OK, "Indicare il Magazzino");
            }

            return retValue;
        }

        [HttpPost]
        public System.Net.Http.HttpResponseMessage LoadArticolimagazzinoCliente(DTParameters data)
        {
            System.Net.Http.HttpResponseMessage retValue = new HttpResponseMessage(HttpStatusCode.InternalServerError);

            string m_name = HttpContext.Current.User.Identity.Name;
            Console.Write(m_name);

            Guid m_id = Guid.Empty;
            using (CustomerOperatorsFacade m_cof = CustomerOperatorsFacade.Create())
            {
                ReturnValue<CustomerOperatorBag> m_operator = m_cof.GetCustomerOperatorBags(m_name);

                if (m_operator.HasValue && m_operator.Value != null)
                {
                    if (m_operator.Value.Customer.HasValue)
                    {
                        m_id = m_operator.Value.Customer.Value;
                    }
                }
            }

            DTResult<ArticoloBag> result = DTResult<ArticoloBag>.Empty("Nessun elemento trovato");
            if (m_id != Guid.Empty)
            {
                using (AnagraficaArticoliFacade m_dc = AnagraficaArticoliFacade.Create())
                {
                    ReturnValue<IQueryable<ArticoloBag>> m_objs = m_dc.GetAllArticoliBag(m_id);

                    if (m_objs.HasValue)
                    {
                        AnagraficaArticoliResultSet m_rs = new AnagraficaArticoliResultSet(data, m_objs.Value);
                        result = m_rs.GetResult();
                    }
                    else
                    {
                        if (m_objs.HasError)
                        {
                            result.Message.MessageType = MessageTypes.Error;
                            result.Message.Message = m_objs.Error.Message;
                        }
                    }

                    retValue = Request.CreateResponse(HttpStatusCode.OK, result);
                }
            }
            else
            {
                retValue = Request.CreateResponse(HttpStatusCode.OK, result);
            }

            return retValue;
        }

        [HttpPost]
        public System.Net.Http.HttpResponseMessage FornitoriPerArticolo(FornitoriDTParams data)
        {
            System.Net.Http.HttpResponseMessage retValue = new HttpResponseMessage(HttpStatusCode.InternalServerError);

            Guid m_idArticolo = Guid.Parse(data.IDArticolo.Replace("string:", ""));

            using (ArticoliPerFornitoreFacade m_dc = ArticoliPerFornitoreFacade.Create())
            {
                ReturnValue<IQueryable<FornitoreArticoloBag>> m_objs = m_dc.GetFornitoriPerArticoloBag(m_idArticolo);

                DTResult<FornitoreArticoloBag> result = DTResult<FornitoreArticoloBag>.Empty("Nessun elemento trovato");
                if (m_objs.HasValue)
                {
                    ArticoliPerFornitoreResultSet m_rs = new ArticoliPerFornitoreResultSet(data, m_objs.Value);
                    result = m_rs.GetResult();
                }
                else
                {
                    if (m_objs.HasError)
                    {
                        result.Message.MessageType = MessageTypes.Error;
                        result.Message.Message = m_objs.Error.Message;
                    }
                }

                retValue = Request.CreateResponse(HttpStatusCode.OK, result);
            }

            return retValue;
        }

        [HttpGet]
        public List<NameValue<string, Guid>> LoadArticoli()
        {
            List<NameValue<string, Guid>> retValue = null;

            using (AnagraficaArticoliFacade m_cf = AnagraficaArticoliFacade.Create())
            {
                ReturnValue<IEnumerable<NameValue<string, Guid>>> result = m_cf.GetAllNameValue();
                if (result.HasValue)
                {
                    retValue = result.Value.ToList();
                }
            }

            return retValue;
        }

        [HttpPost]
        public List<NameValue<string, Guid>> LoadArticoliByCustomer(JObject data)
        {
            List<NameValue<string, Guid>> retValue = null;

            dynamic json = data;
            Guid m_id = Guid.Parse(json.parameters[0].ToString());

            using (AnagraficaArticoliFacade m_cf = AnagraficaArticoliFacade.Create())
            {
                var objs = m_cf.GetAllByCustomer(m_id);

                if (objs.HasValue)
                {
                    if (objs.Value.Any())
                    {
                        retValue = objs.Value.Select(x => new NameValue<string, Guid>() { name = (x.Codice + " - " + x.Descrizione), value = x.Id }).ToList();
                        retValue.Insert(0, new NameValue<string, Guid>() { name = "Seleziona un elemento...", value = Guid.Empty });
                    }
                }
            }

            return retValue;
        }

        [HttpPost]
        public System.Net.Http.HttpResponseMessage GetFoto(JObject data)
        {
            System.Net.Http.HttpResponseMessage retValue = null;

            dynamic json = data;

            Guid m_id = Guid.Parse(json.id.ToString());

            using (AnagraficaArticoliFacade m_cf = AnagraficaArticoliFacade.Create())
            {
                ReturnValue<string> result = m_cf.GetFoto(m_id);

                retValue = Request.CreateResponse(HttpStatusCode.OK, result.Value);
            }

            return retValue;
        }

        [HttpPost]
        public System.Net.Http.HttpResponseMessage GetDettaglio(JObject data)
        {
            System.Net.Http.HttpResponseMessage retValue = null;

            dynamic json = data;

            if (json != null)
            {
                Guid m_id = Guid.Parse(json.id.ToString());

                using (AnagraficaArticoliFacade m_cf = AnagraficaArticoliFacade.Create())
                {
                    ReturnValue<ArticoloBag> result = m_cf.GetArticoloBag(m_id);

                    retValue = Request.CreateResponse(HttpStatusCode.OK, result.Value);
                }
            }

            return retValue;
        }

        [HttpPost]
        public System.Net.Http.HttpResponseMessage GetDettaglioByFornitore(JObject data)
        {
            System.Net.Http.HttpResponseMessage retValue = null;

            dynamic json = data;

            if (json != null)
            {
                Guid m_id = Guid.Parse(json.id.ToString());
                Guid m_idF = Guid.Parse(json.idFornitore.ToString());

                using (AnagraficaArticoliFacade m_cf = AnagraficaArticoliFacade.Create())
                {
                    ReturnValue<ArticoloBag> result = m_cf.GetArticoloBag(m_id, m_idF);

                    retValue = Request.CreateResponse(HttpStatusCode.OK, result.Value);
                }
            }

            return retValue;
        }

        [HttpPost]
        public System.Net.Http.HttpResponseMessage GetArticoloByCodiceFornitore(JObject data)
        {
            System.Net.Http.HttpResponseMessage retValue = Request.CreateResponse(HttpStatusCode.NoContent);

            dynamic json = data;

            if (json.id != null)
            {
                Guid m_idCodice = Guid.Parse(json.id.ToString());

                using (CodiciFornitoriFacade m_cff = CodiciFornitoriFacade.Create())
                {
                    ReturnValue<FCD_CodiciFornitori> result = m_cff.Get(m_idCodice, "FCD_AnagraficaArticolis");

                    if (result.HasValue)
                    {
                        if (result.Value != null)
                        {
                            if (result.Value.FCD_AnagraficaArticolis.Any())
                            {
                                FCD_AnagraficaArticoli m_objArt = result.Value.FCD_AnagraficaArticolis.FirstOrDefault();
                                retValue = Request.CreateResponse(HttpStatusCode.OK, m_objArt.Id);
                            }
                        }
                    }
                    else
                    {
                        if (result.HasError)
                        {
                            retValue = Request.CreateResponse(HttpStatusCode.OK, result.Error.Message);
                        }
                    }
                }
            }

            return retValue;
        }

        [HttpPost]
        public List<NameValue<string, Guid>> LoadCodiciArticoli(JObject data)
        {
            List<NameValue<string, Guid>> retValue = null;

            dynamic json = data;

            if (json != null)
            {
                if (json.parameters[0] != null && json.parameters[0] != "")
                {
                    Guid m_id = Guid.Parse(json.parameters[0].ToString());

                    using (AnagraficaArticoliFacade m_cf = AnagraficaArticoliFacade.Create())
                    {
                        var objs = m_cf.GetAllCodice(m_id);

                        if (objs.HasValue)
                        {
                            if (objs.Value.Any())
                            {
                                List<NameValue<string, Guid>> m_list = objs.Value.ToList();
                                m_list.Insert(0, new NameValue<string, Guid>() { name = "Select...", value = Guid.Empty });
                                retValue = m_list;
                            }
                        }
                    }
                }
            }

            return retValue;
        }

        [HttpGet]
        public System.Net.Http.HttpResponseMessage GetMagazzinoFormUser()
        {
            System.Net.Http.HttpResponseMessage retValue = Request.CreateResponse(HttpStatusCode.InternalServerError);

            string m_userName = HttpContext.Current.User.Identity.Name;

            Guid m_id = Guid.Empty;
            using (CustomerOperatorsFacade m_cof = CustomerOperatorsFacade.Create())
            {
                ReturnValue<CustomerOperatorBag> m_res = m_cof.GetCustomerOperatorBags(m_userName);
                if (m_res.HasValue && m_res.Value != null)
                {
                    CustomerOperatorBag m_cob = m_res.Value;

                    retValue = Request.CreateResponse(HttpStatusCode.OK, m_cob);
                }
            }
            
            return retValue;
        }

        [HttpGet]
        public int GetCodiceXXXX()
        {
            int retValue = -1;

            using (AnagraficaArticoliFacade m_cof = AnagraficaArticoliFacade.Create())
            {
                retValue = m_cof.GetCodiceXXXX();
            }
            
            return retValue;
        }

        [HttpPost]
        public System.Net.Http.HttpResponseMessage SpostaArticolo(JObject data)
        {
            System.Net.Http.HttpResponseMessage retValue = new HttpResponseMessage(HttpStatusCode.InternalServerError);

            dynamic json = data;

            Guid m_idArticolo = Guid.Parse(json.Articolo.ToString());
            Guid m_idNuovoMag = Guid.Parse(json.selMagazzini.ToString());

            try
            {
                // varificare se l'articolo è utilizzato in un movimento di carico / scarico
                // quindi cancellare le eventuali associazioni con codice fornitore
                // cambiare il magazzino
                bool m_goOn = false;
                ReturnValue<bool> m_resMov = new ReturnValue<bool>(false);
                using (MovimentiFacade m_mf = MovimentiFacade.Create())
                {
                    m_resMov = m_mf.CheckArticoloInMovimento(m_idArticolo);
                    if (m_resMov.HasValue && m_resMov.Value)
                    {
                        retValue = Request.CreateResponse(HttpStatusCode.OK, "Articolo utilizzato in un movimento. Spostamento articolo annullato.");
                    }
                    else
                    {
                        if (m_resMov.HasError)
                        {
                            retValue = Request.CreateResponse(HttpStatusCode.OK, m_resMov.Error.Message);
                        }
                        else
                        {
                            // procedi con lo spostamento...
                            m_goOn = true;
                        }
                    }
                }

                if (m_goOn)
                {
                    using (CodiciFornitoriFacade m_cff = CodiciFornitoriFacade.Create())
                    {
                        m_cff.RemoveAssociazioneArticoli(m_idArticolo);
                    }

                    // assegnare l'articolo al nuovo magazzino...
                    using (AnagraficaArticoliFacade m_aaf = AnagraficaArticoliFacade.Create())
                    {
                        ReturnValue<FCD_AnagraficaArticoli> m_resAAF = m_aaf.Get(m_idArticolo);
                        if (m_resAAF.HasValue && m_resAAF.Value != null)
                        {
                            m_resAAF.Value.IdCliente = m_idNuovoMag;

                            ReturnValue<bool> m_resGet = m_aaf.Edit(m_resAAF.Value);
                            if (m_resGet.HasValue && m_resGet.Value)
                            {
                                retValue = Request.CreateResponse(HttpStatusCode.OK, "Spostamento articolo effettuato.");
                            }
                            else
                            {
                                if (m_resGet.HasError)
                                {
                                    retValue = Request.CreateResponse(HttpStatusCode.OK, m_resGet.Error.Message);
                                }
                                else
                                {
                                    retValue = Request.CreateResponse(HttpStatusCode.OK, "Si è verificato un errore. Spostamento articolo non effettuato.");
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                string msg = string.Format("Errore nello spostamento della Anagrafica Articolo: {0}", ex.Message);
                retValue = Request.CreateResponse(HttpStatusCode.OK, msg);
            }

            return retValue;
        }
    }

    public class FornitoriDTParams : DTParameters
    {
        public string IDArticolo { get; set; }

        public FornitoriDTParams()
        {

        }
    }
}